import axios from 'axios'
import { Message } from '@arco-design/web-vue'
import { getToken } from '@/utils/cache/cookies'
import { useUserStore } from '@/store/modules/user'

// 标志变量，记录是否已经显示过错误信息
let hasErrored = false
// 定时器，用于在一段时间后重置标志变量
let errorTimeout = null
const userStore = useUserStore()
const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_URL,
  timeout: 1800000, // 超时
  headers: {
    Userid: userStore.userId
    // "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
  }
})

// Request interceptors for API calls
instance.interceptors.request.use(
  (config) => {
    config.headers = {
      Authorization: 'Bearer ' + getToken(),
      'Content-Type': 'application/json;charset=utf-8',
      ...config.headers
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 添加响应拦截器
instance.interceptors.response.use(
  (response) => {
    const { data } = response
    const code = data?.code
    const innerData = data?.data
    let msg = ''

    if (typeof innerData === 'string' && innerData.trim()) {
      msg = innerData.trim()
    } else if (data?.message?.trim()) {
      msg = data.message.trim()
    } else {
      msg = '哎呀，服务器开小差了，请稍后重试！'
    }

    if (code === 200) {
      return data
    }

    if (code === 401 || code === 500) {
      if (!hasErrored) {
        Message.error({
          content: msg || (code === 401 ? '登录已过期，请重新登录' : '服务器内部错误')
        })
        hasErrored = true
        errorTimeout && clearTimeout(errorTimeout)
        errorTimeout = setTimeout(() => {
          hasErrored = false
        }, 1000)
      }
    } else {
      Message.error({
        content: msg
      })
    }

    return Promise.reject(data)
  },
  (error) => {
    const { response } = error
    if (response) {
      const httpStatus = response.status
      let code = 0
      let message = '请求失败'
      // 防止 data 是 HTML 或格式不标准
      if (response.data && typeof response.data === 'object') {
        code = response.data.code || httpStatus
        message = response.data.message || '服务器异常'
      } else {
        code = httpStatus
        message = `请求失败，状态码：${httpStatus}`
      }
      // 统一处理
      errorHandle(code, message)
      return Promise.reject(response)
    } else {
      // 超时提示
      if (error.message.includes('timeout')) {
        return Promise.reject(error)
      } else {
        return Promise.reject(error)
      }
    }
  }
)

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 * 1**  信息，服务器收到请求，需要请求者继续执行操作
 * 2**  成功，操作被成功接收并处理
 * 3**  重定向，需要进一步的操作以完成请求
 * 4**  客户端错误，请求包含语法错误或无法完成请求
 * 5**  服务器错误，服务器在处理请求的过程中发生了错误
 * @param message 提示信息
 */
const errorHandle = (status, message = '') => {
  switch (status) {
    case 400:
      Message.error('接口请求错误！')
      break
    case 401:
      Message.error('认证失败，无法访问系统资源')
      break
    case 403:
      Message.error('当前操作没有权限，拒绝访问！')
      break
    case 404:
      Message.error('请求的资源不存在或请求地址出错！')
      break
    case 405:
      Message.error('客户端请求中的方法被禁止')
      break
    case 408:
      Message.error('请求超时')
      break
    case 500:
      Message.error('服务器错误！')
      break
    case 503:
      Message.error('由于超载或系统维护，服务器暂无服务！')
      break
    case 1000001:
      Message.error('token异常，请联系管理员！')
      break
    default:
      Message.error(message || '哎呀，服务器开小差了,请稍后重试！')
  }
}

export default instance
